package cn.rocky.pandacodegen.common.config;

import cn.rocky.pandacodegen.common.enums.DbType;
import cn.rocky.pandacodegen.domain.entity.DatasourceConfig;
import lombok.Data;
import org.springframework.beans.BeanUtils;

import java.util.Objects;

/**
 * 代码生成配置
 *
 * @author Rocky
 * @date 2023/07/05
 */
@Data
public class GeneratorConfig {

    /**
     * 数据库类型
     */
    private Integer dbType;
    /**
     * 数据库名称
     */
    private String dbName;
    /**
     * schema(PGSQL专用)
     */
    private String schemaName;
    /**
     * 数据库host
     */
    private String host;
    /**
     * 数据库端口
     */
    private Integer port;
    /**
     * 数据库用户名
     */
    private String username;
    /**
     * 数据库密码
     */
    private String password;


    /**
     * 构建数据源配置
     *
     * @param datasourceConfig 数据源配置
     * @return {@code GeneratorConfig}
     */
    public static GeneratorConfig build(DatasourceConfig datasourceConfig) {
        GeneratorConfig generatorConfig = new GeneratorConfig();
        BeanUtils.copyProperties(datasourceConfig, generatorConfig);
        return generatorConfig;
    }

    /**
     * 获取驱动程序类
     *
     * @return {@code String}
     */
    public String getDriverClass() {
        DbType dbType = DbType.getDbType(this.dbType);
        if (Objects.isNull(dbType)) throw new RuntimeException("不支持数据库类型" + this.dbType + "，请在DbType.java中配置");
        return dbType.getDriverClass();
    }

    /**
     * 获得 jdbc url
     *
     * @return {@code String}
     */
    public String getJdbcUrl() {
        DbType dbType = DbType.getDbType(this.dbType);
        if (dbType == null) {
            throw new RuntimeException("不支持数据库类型" + this.dbType + "，请在DbType.java中配置");
        }
        String jdbcUrl = dbType.getJdbcUrl();
        return String.format(jdbcUrl, host, port, dbName);
    }
}
